package com.mysoft.disconf.mybatis;

import java.io.Serializable;
import java.util.List;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.support.SqlSessionDaoSupport;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;

/**
 * MyBatis 基础DAO: 
 */
public abstract class BaseDao<T extends Object, ID extends Serializable> extends SqlSessionDaoSupport {

	@Autowired  
    public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory){  
        super.setSqlSessionFactory(sqlSessionFactory);  
    }
	
    /**
     * 新增对象
     * 
     * @param classMethod ： MyBatis xml 配置文件中的SQL - Key
     * @param entity ： 需要进行新增的Bean对象
     * @return true ： 成功 false ： 失败
     * @throws DataAccessException
     */
    public int insert(String classMethod, T entity) throws DataAccessException {
        int flag = 0;
        try {
            flag = this.getSqlSession().insert(classMethod, entity);
        } catch (DataAccessException e) {
            throw e;
        }
        return flag;
    }

    /**
     * 更新数据
     * 
     * @param classMethod ： MyBatis xml 配置文件中的SQL - Key
     * @param entity： 需要进行更新的Bean对象
     * @return true ： 成功 false ： 失败
     * @throws DataAccessException
     */
    public int update(String classMethod, T entity) throws DataAccessException {
        int flag = 0;
        try {
            flag = this.getSqlSession().update(classMethod, entity);
        } catch (DataAccessException e) {
            throw e;
        }
        return flag;
    }

    /**
     * 查询一条记录
     * 
     * @param classMethod： MyBatis xml 配置文件中的SQL - Key
     * @param entity： 查询参数对象，可以是自定义的查询对象
     * @return 返回一个对象
     * @throws DataAccessException
     */
    public Object queryCountForObject(String classMethod, Object entity) throws DataAccessException {
        Object result = null;
        try {
            result = (Object) this.getSqlSession().selectOne(classMethod, entity);
        } catch (DataAccessException e) {
            throw e;
        }
        return result;
    }

    /**
     * 查询一条记录(根据查询条件)
     * 
     * @param classMethod： MyBatis xml 配置文件中的SQL - Key
     * @param entity： 查询参数对象，可以是自定义的查询对象
     * @return 返回一个对象（建议用Integer）
     * @throws DataAccessException
     */
    @SuppressWarnings("unchecked")
    public T queryForObject(String classMethod, T entity) throws DataAccessException {
        T result = null;
        try {
            result = (T) this.getSqlSession().selectOne(classMethod, entity);
        } catch (DataAccessException e) {
            throw e;
        }
        return result;
    }
    
    /**
     * 查询一条记录(根据ID主键)
     * 
     * @param classMethod： MyBatis xml 配置文件中的SQL - Key
     * @param entity： 查询参数对象，可以是自定义的查询对象
     * @return 返回一个对象（建议用Integer）
     * @throws DataAccessException
     */
    @SuppressWarnings("unchecked")
    public T queryForObjectByID(String classMethod, ID id) throws DataAccessException {
        T result = null;
        try {
            result = (T) this.getSqlSession().selectOne(classMethod, id);
        } catch (DataAccessException e) {
            throw e;
        }
        return result;
    }

    /**
     * 查询一组记录
     * 
     * @param classMethod： MyBatis xml 配置文件中的SQL - Key
     * @param entity 查询参数对象，可以是自定义的查询对象
     * @return 返回一组对象
     * @throws DataAccessException
     */
    public List<T> queryForList(String classMethod, T entity) throws DataAccessException {
        List<T> result = null;
        try {
            result = this.getSqlSession().selectList(classMethod, entity);
        } catch (DataAccessException e) {
            throw e;
        }
        return result;
    }
    /**
     * 传入参数对象与返回结果对象不同查询
     * @param classMethod
     * @param entity
     * @return
     * @throws DataAccessException
     */
    public List<Object> queryForObjectList(String classMethod, Object entity) throws DataAccessException {
    	List<Object> result = null;
    	try {
    		result = this.getSqlSession().selectList(classMethod, entity);
    	} catch (DataAccessException e) {
    		throw e;
    	}
    	return result;
    }
    
    /**
     * 查询一组记录
     * 
     * @param classMethod： MyBatis xml 配置文件中的SQL - Key
     * @return 返回一组对象
     * @throws DataAccessException
     */
    public List<T> queryForList(String classMethod) throws DataAccessException {
        List<T> result = null;
        try {
            result = this.getSqlSession().selectList(classMethod);
        } catch (DataAccessException e) {
            throw e;
        }
        return result;
    }

    /**
     * 删除记录(根据条件)
     * 
     * @param classMethod: MyBatis xml 配置文件中的SQL - Key
     * @param entity 可以传入需要删除的记录对象,也可以只传入一个ID字段，可以根据SQL语句自行组合
     * @return ： 成功 false ： 失败
     * @throws Exception
     */
    public int delete(String classMethod, T entity) throws DataAccessException {
        int flag = 0;
        try {
            flag = this.getSqlSession().delete(classMethod, entity);
        } catch (DataAccessException e) {
            throw e;
        }
        return flag;
    }
    
    /**
     * 删除记录(根据ID主键)
     * 
     * @param classMethod: MyBatis xml 配置文件中的SQL - Key
     * @param entity 可以传入需要删除的记录对象,也可以只传入一个ID字段，可以根据SQL语句自行组合
     * @return ： 成功 false ： 失败
     * @throws Exception
     */
    public int deleteById(String classMethod, ID id) throws DataAccessException {
        int flag = 0;
        try {
            flag = this.getSqlSession().delete(classMethod, id);
        } catch (DataAccessException e) {
            throw e;
        }
        return flag;
    }

}